NexusPi Git Node
tests/conftest.py main (ee519cc2) Text, 9.82 KB
T8b949e"""
pytest configuration for the RTNode LoRa test suite.
RTNode (FIREWALL_MODE) specifics
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
In FIREWALL_MODE the RTNode serial port is used for ASCII RNS debug
logging only. serial_write() is a compile-time no-op (Utilities.h,
arrive from the RTNode; all self-tests use log-line parsing instead.
The RNode probe (--rnode-port) IS a standard KISS TNC and responds
normally to KISS commands.
Channel configuration
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Because the RTNode does not answer KISS config queries, the LoRa channel
must be supplied via CLI options. Defaults are the Reticulum EU868
medium-fast preset; override them to match your device's EEPROM config.
Usage
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Self-tests only (no RNode needed):
pytest tests/ --rtnode-port /dev/cu.usbmodem114401 -v
Full TX/RX tests with an RNode probe:
pytest tests/ \
--rtnode-port /dev/cu.usbmodem114401 \
--rnode-port /dev/cu.usbmodem11201 \
--lora-freq 869525000 \
--lora-bw 250000 \
--lora-sf 8 \
--lora-cr 5 \
-v
"""
Tff7b72import T7ee787struct
Tff7b72import T7ee787glob
Tff7b72import T7ee787time
Tff7b72import T7ee787pytest
Tff7b72import T7ee787serial
Tff7b72from T7ee787kiss_serial Tff7b72import Tb4b4b4(
Te6edf3CMD_BANDWIDTHTb4b4b4,
Te6edf3CMD_CRTb4b4b4,
Te6edf3CMD_FREQUENCYTb4b4b4,
Te6edf3CMD_IMPLICITTb4b4b4,
Te6edf3CMD_RADIO_STATETb4b4b4,
Te6edf3CMD_SFTb4b4b4,
Te6edf3CMD_TXPOWERTb4b4b4,
Te6edf3RADIO_STATE_OFFTb4b4b4,
Te6edf3RADIO_STATE_ONTb4b4b4,
Te6edf3KissSerialTb4b4b4,
Te6edf3RadioConfigTb4b4b4,
Tb4b4b4)
T8b949e# ── command-line options ──────────────────────────────────────────────────────
Tff7b72def Td2a8ffpytest_addoptionTb4b4b4(Te6edf3parserTb4b4b4)Tb4b4b4:
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--rtnode-portTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSerial port for the RTNode (Heltec V4 running FIREWALL_MODE firmware)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--rnode-portTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSerial port for the RNode probe used as LoRa TX/RX referenceTa5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--baudTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff115200Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSerial baud rate (default: 115200)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--rtnode-hostTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Ta5d6ff"Ta5d6ffmynode.localTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffRTNode TCP server hostname (default: mynode.local)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--rtnode-tcp-portTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff4242Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffRTNode TCP server port (default: 4242)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--rx-timeoutTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff15.0Tb4b4b4,
Tffa657typeTff7b72=Tffa657floatTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSeconds to wait for a LoRa receive event (default: 15)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--announce-timeoutTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff120.0Tb4b4b4,
Tffa657typeTff7b72=Tffa657floatTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffSeconds to wait for an RTNode LoRa transmission to be picked up Ta5d6ff"
Ta5d6ff"Ta5d6ffby the RNode probe (default: 120). RTNode announces periodically; Ta5d6ff"
Ta5d6ff"Ta5d6ffincrease if your device has a long announce interval.Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--tx-payloadTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Ta5d6ff"Ta5d6ffRTNode-testTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffASCII payload sent by the RNode in RX-path testsTa5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# ── LoRa channel parameters ────────────────────────────────────────────────
T8b949e# Defaults: Reticulum EU868 medium-fast preset
T8b949e# Change these to match your device's EEPROM-provisioned channel config.
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--lora-freqTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff869_525_000Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLoRa centre frequency in Hz (default: 869525000, EU868 medium preset)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--lora-bwTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff250_000Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLoRa bandwidth in Hz (default: 250000)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--lora-sfTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff8Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLoRa spreading factor 5-12 (default: 8)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--lora-crTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff5Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLoRa coding rate 5-8, where N means 4/N (default: 5 = 4/5)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffaddoptionTb4b4b4(
Ta5d6ff"Ta5d6ff--lora-txpTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=T79c0ff14Tb4b4b4,
Tffa657typeTff7b72=Tffa657intTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffLoRa TX power in dBm (default: 14)Ta5d6ff"Tb4b4b4,
Tb4b4b4)
T8b949e# ── auto-discovery helpers ────────────────────────────────────────────────────
Tff7b72def Td2a8ff_auto_detect_portTb4b4b4(Te6edf3excludeTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Return the first plausible serial port that is not *exclude*."""
Te6edf3candidatesTb4b4b4: Tffa657listTb4b4b4[Tffa657strTb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3candidates Tff7b72+Tff7b72= Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff/dev/cu.usbmodem*Ta5d6ff"Tb4b4b4) Tff7b72+ Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff/dev/cu.usbserial*Ta5d6ff"Tb4b4b4)
Te6edf3candidates Tff7b72+Tff7b72= Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff/dev/ttyUSB*Ta5d6ff"Tb4b4b4) Tff7b72+ Te6edf3globTff7b72.Td2a8ffglobTb4b4b4(Ta5d6ff"Ta5d6ff/dev/ttyACM*Ta5d6ff"Tb4b4b4)
Tff7b72for Te6edf3p Tff7b72in Te6edf3candidatesTb4b4b4:
Tff7b72if Te6edf3p Tff7b72== Te6edf3excludeTb4b4b4:
Tff7b72continue
Tff7b72tryTb4b4b4:
Te6edf3s Tff7b72= Te6edf3serialTff7b72.Td2a8ffSerialTb4b4b4(Te6edf3pTb4b4b4, T79c0ff115200Tb4b4b4, Te6edf3timeoutTff7b72=T79c0ff0.1Tb4b4b4)
Te6edf3sTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3p
Tff7b72except Te6edf3serialTff7b72.Td2a8ffSerialExceptionTb4b4b4:
Tff7b72pass
Tff7b72return Tff7b72None
T8b949e# ── fixtures ──────────────────────────────────────────────────────────────────
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrtnode_portTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Te6edf3port Tff7b72= Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--rtnode-portTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3port Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3port Tff7b72= Te6edf3_auto_detect_portTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3port Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffNo RTNode port found; pass --rtnode-port /dev/cu.XXXTa5d6ff"Tb4b4b4)
Tff7b72return Te6edf3port
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrnode_portTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Tff7b72return Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--rnode-portTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffbaudTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657intTb4b4b4:
Tff7b72return Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--baudTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrtnode_tcp_endpointTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657tupleTb4b4b4[Tffa657strTb4b4b4, Tffa657intTb4b4b4]Tb4b4b4:
Tff7b72return Tb4b4b4(
Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--rtnode-hostTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--rtnode-tcp-portTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrx_timeoutTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657floatTb4b4b4:
Tff7b72return Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--rx-timeoutTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffannounce_timeoutTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657floatTb4b4b4:
Tff7b72return Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--announce-timeoutTa5d6ff"Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftx_payloadTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Tffa657bytesTb4b4b4:
Tff7b72return Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--tx-payloadTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffchannel_configTb4b4b4(Te6edf3requestTb4b4b4) Tff7b72-Tff7b72> Te6edf3RadioConfigTb4b4b4:
T8b949e"""
LoRa channel configuration used for the whole test session.
Sourced from CLI options; defaults to the Reticulum EU868 medium-fast
preset. Pass --lora-freq / --lora-bw / --lora-sf / --lora-cr to
match the RTNode's EEPROM-provisioned channel.
"""
Tff7b72return Te6edf3RadioConfigTb4b4b4(
Te6edf3frequencyTff7b72=Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--lora-freqTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3bandwidthTff7b72=Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--lora-bwTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3sfTff7b72=Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--lora-sfTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3crTff7b72=Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--lora-crTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3txpowerTff7b72=Te6edf3requestTff7b72.Td2a8ffconfigTff7b72.Td2a8ffgetoptionTb4b4b4(Ta5d6ff"Ta5d6ff--lora-txpTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3stateTff7b72=Te6edf3RADIO_STATE_ONTb4b4b4,
Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrtnode_configTb4b4b4(Te6edf3channel_configTb4b4b4) Tff7b72-Tff7b72> Te6edf3RadioConfigTb4b4b4:
T8b949e"""
Alias for channel_config.
The RTNode does not answer KISS config queries (serial_write() is a
no-op in FIREWALL_MODE), so CLI-supplied values are the authoritative
source of the device's channel configuration.
"""
Tff7b72return Te6edf3channel_config
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrtnodeTb4b4b4(Te6edf3rtnode_portTb4b4b4, Te6edf3baudTb4b4b4) Tff7b72-Tff7b72> Te6edf3KissSerialTb4b4b4:
T8b949e"""
Open a connection to the RTNode for the whole test session.
Resets the device via DTR/RTS at session start so the startup log
(including ``[Boundary] LoRa: freq=... bw=... sf=... cr=... txp=...``)
is always captured. This makes ``test_channel_config`` reliable rather
than dependent on the device having been rebooted externally.
"""
Te6edf3ks Tff7b72= Te6edf3KissSerialTb4b4b4(Te6edf3portTff7b72=Te6edf3rtnode_portTb4b4b4, Te6edf3baudTff7b72=Te6edf3baudTb4b4b4)
Te6edf3ksTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
T8b949e# Brief settle before toggling control lines
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.5Tb4b4b4)
T8b949e# Standard Arduino/ESP32 auto-reset: DTR=F, RTS=T → RESET=low; then both=F → boot
Tff7b72tryTb4b4b4:
Te6edf3ksTff7b72.Td2a8ff_serTff7b72.Td2a8ffsetDTRTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_serTff7b72.Td2a8ffsetRTSTb4b4b4(Tff7b72TrueTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_serTff7b72.Td2a8ffsetDTRTb4b4b4(Tff7b72FalseTb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_serTff7b72.Td2a8ffsetRTSTb4b4b4(Tff7b72FalseTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72pass T8b949e# DTR not available on all adapters — continue without reset
T8b949e# Wait for ESP32-S3 to boot and for RNS to initialise (typically 3-4 s)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff5.0Tb4b4b4)
Tff7b72yield Te6edf3ks
Te6edf3ksTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3scopeTff7b72=Ta5d6ff"Ta5d6ffsessionTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ffrnodeTb4b4b4(Te6edf3rnode_portTb4b4b4, Te6edf3baudTb4b4b4, Te6edf3channel_configTb4b4b4) Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ffKissSerial | NoneTa5d6ff"Tb4b4b4:
T8b949e"""
Open a connection to the RNode probe (if --rnode-port is provided).
Configures the RNode with channel_config parameters so it is on the
same LoRa channel as the RTNode, enables promiscuous mode, and powers
the radio on.
"""
Tff7b72if Te6edf3rnode_port Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3ks Tff7b72= Te6edf3KissSerialTb4b4b4(Te6edf3portTff7b72=Te6edf3rnode_portTb4b4b4, Te6edf3baudTff7b72=Te6edf3baudTb4b4b4)
Te6edf3ksTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff1.5Tb4b4b4)
Te6edf3cfg Tff7b72= Te6edf3channel_config
T8b949e# Some RNode config setters leave the SX126x out of continuous RX when
T8b949e# applied while the radio is already online. Force a clean restart so the
T8b949e# final RADIO_STATE_ON path always calls LoRa->receive().
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_RADIO_STATETb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3RADIO_STATE_OFFTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_FREQUENCYTb4b4b4, Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff>ITa5d6ff"Tb4b4b4, Te6edf3cfgTff7b72.Td2a8fffrequencyTb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_BANDWIDTHTb4b4b4, Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ff>ITa5d6ff"Tb4b4b4, Te6edf3cfgTff7b72.Td2a8ffbandwidthTb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_TXPOWERTb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3cfgTff7b72.Td2a8fftxpowerTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_SFTb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3cfgTff7b72.Td2a8ffsfTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_CRTb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3cfgTff7b72.Td2a8ffcrTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.05Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_IMPLICITTb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[T79c0ff0x00Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ff_send_frameTb4b4b4(Te6edf3CMD_RADIO_STATETb4b4b4, Tffa657bytesTb4b4b4(Tb4b4b4[Te6edf3RADIO_STATE_ONTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.3Tb4b4b4)
Te6edf3ksTff7b72.Td2a8ffenable_promiscTb4b4b4(Tb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.2Tb4b4b4)
Tff7b72yield Te6edf3ks
Te6edf3ksTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Served by rngit 1.4.2 - Generated in 0.03s